{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n",
      "sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.2\n",
      "pandas 0.24.2\n",
      "sklearn 0.20.3\n",
      "tensorflow 2.0.0-alpha0\n",
      "tensorflow.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Downloading Cal. housing from https://ndownloader.figshare.com/files/5976036 to /Users/zhangyx/scikit_learn_data\n",
      "WARNING: Logging before flag parsing goes to stderr.\n",
      "I0407 21:12:54.897786 140736816485312 california_housing.py:114] Downloading Cal. housing from https://ndownloader.figshare.com/files/5976036 to /Users/zhangyx/scikit_learn_data\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".. _california_housing_dataset:\n",
      "\n",
      "California Housing dataset\n",
      "--------------------------\n",
      "\n",
      "**Data Set Characteristics:**\n",
      "\n",
      "    :Number of Instances: 20640\n",
      "\n",
      "    :Number of Attributes: 8 numeric, predictive attributes and the target\n",
      "\n",
      "    :Attribute Information:\n",
      "        - MedInc        median income in block\n",
      "        - HouseAge      median house age in block\n",
      "        - AveRooms      average number of rooms\n",
      "        - AveBedrms     average number of bedrooms\n",
      "        - Population    block population\n",
      "        - AveOccup      average house occupancy\n",
      "        - Latitude      house block latitude\n",
      "        - Longitude     house block longitude\n",
      "\n",
      "    :Missing Attribute Values: None\n",
      "\n",
      "This dataset was obtained from the StatLib repository.\n",
      "http://lib.stat.cmu.edu/datasets/\n",
      "\n",
      "The target variable is the median house value for California districts.\n",
      "\n",
      "This dataset was derived from the 1990 U.S. census, using one row per census\n",
      "block group. A block group is the smallest geographical unit for which the U.S.\n",
      "Census Bureau publishes sample data (a block group typically has a population\n",
      "of 600 to 3,000 people).\n",
      "\n",
      "It can be downloaded/loaded using the\n",
      ":func:`sklearn.datasets.fetch_california_housing` function.\n",
      "\n",
      ".. topic:: References\n",
      "\n",
      "    - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
      "      Statistics and Probability Letters, 33 (1997) 291-297\n",
      "\n",
      "(20640, 8)\n",
      "(20640,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_california_housing\n",
    "\n",
    "housing = fetch_california_housing()\n",
    "print(housing.DESCR)\n",
    "print(housing.data.shape)\n",
    "print(housing.target.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "array([[ 8.32520000e+00,  4.10000000e+01,  6.98412698e+00,\n",
      "         1.02380952e+00,  3.22000000e+02,  2.55555556e+00,\n",
      "         3.78800000e+01, -1.22230000e+02],\n",
      "       [ 8.30140000e+00,  2.10000000e+01,  6.23813708e+00,\n",
      "         9.71880492e-01,  2.40100000e+03,  2.10984183e+00,\n",
      "         3.78600000e+01, -1.22220000e+02],\n",
      "       [ 7.25740000e+00,  5.20000000e+01,  8.28813559e+00,\n",
      "         1.07344633e+00,  4.96000000e+02,  2.80225989e+00,\n",
      "         3.78500000e+01, -1.22240000e+02],\n",
      "       [ 5.64310000e+00,  5.20000000e+01,  5.81735160e+00,\n",
      "         1.07305936e+00,  5.58000000e+02,  2.54794521e+00,\n",
      "         3.78500000e+01, -1.22250000e+02],\n",
      "       [ 3.84620000e+00,  5.20000000e+01,  6.28185328e+00,\n",
      "         1.08108108e+00,  5.65000000e+02,  2.18146718e+00,\n",
      "         3.78500000e+01, -1.22250000e+02]])\n",
      "array([4.526, 3.585, 3.521, 3.413, 3.422])\n"
     ]
    }
   ],
   "source": [
    "import pprint\n",
    "\n",
    "pprint.pprint(housing.data[0:5])\n",
    "pprint.pprint(housing.target[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(11610, 8) (11610,)\n",
      "(3870, 8) (3870,)\n",
      "(5160, 8) (5160,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
    "    housing.data, housing.target, random_state = 7)\n",
    "x_train, x_valid, y_train, y_valid = train_test_split(\n",
    "    x_train_all, y_train_all, random_state = 11)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_test.shape, y_test.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "x_valid_scaled = scaler.transform(x_valid)\n",
    "x_test_scaled = scaler.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_2 (Dense)              (None, 30)                270       \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 1)                 31        \n",
      "=================================================================\n",
      "Total params: 301\n",
      "Trainable params: 301\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation='relu',\n",
    "                       input_shape=x_train.shape[1:]),\n",
    "    keras.layers.Dense(1),\n",
    "])\n",
    "model.summary()\n",
    "model.compile(loss=\"mean_squared_error\", optimizer=\"sgd\")\n",
    "callbacks = [keras.callbacks.EarlyStopping(\n",
    "    patience=5, min_delta=1e-2)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/100\n",
      "11610/11610 [==============================] - 1s 101us/sample - loss: 1.5306 - val_loss: 0.9205\n",
      "Epoch 2/100\n",
      "11610/11610 [==============================] - 1s 67us/sample - loss: 0.8158 - val_loss: 0.8267\n",
      "Epoch 3/100\n",
      "11610/11610 [==============================] - 1s 67us/sample - loss: 0.7440 - val_loss: 0.7793\n",
      "Epoch 4/100\n",
      "11610/11610 [==============================] - 1s 68us/sample - loss: 0.7018 - val_loss: 0.7401\n",
      "Epoch 5/100\n",
      "11610/11610 [==============================] - 1s 68us/sample - loss: 0.6664 - val_loss: 0.7071\n",
      "Epoch 6/100\n",
      "11610/11610 [==============================] - 1s 66us/sample - loss: 0.6354 - val_loss: 0.6767\n",
      "Epoch 7/100\n",
      "11610/11610 [==============================] - 1s 64us/sample - loss: 0.6085 - val_loss: 0.6486\n",
      "Epoch 8/100\n",
      "11610/11610 [==============================] - 1s 92us/sample - loss: 0.5847 - val_loss: 0.6237\n",
      "Epoch 9/100\n",
      "11610/11610 [==============================] - 1s 79us/sample - loss: 0.5646 - val_loss: 0.6026\n",
      "Epoch 10/100\n",
      "11610/11610 [==============================] - 1s 67us/sample - loss: 0.5473 - val_loss: 0.5853\n",
      "Epoch 11/100\n",
      "11610/11610 [==============================] - 1s 64us/sample - loss: 0.5323 - val_loss: 0.5697\n",
      "Epoch 12/100\n",
      "11610/11610 [==============================] - 1s 103us/sample - loss: 0.5196 - val_loss: 0.5548\n",
      "Epoch 13/100\n",
      "11610/11610 [==============================] - 1s 81us/sample - loss: 0.5088 - val_loss: 0.5434\n",
      "Epoch 14/100\n",
      "11610/11610 [==============================] - 1s 110us/sample - loss: 0.4993 - val_loss: 0.5336\n",
      "Epoch 15/100\n",
      "11610/11610 [==============================] - 1s 75us/sample - loss: 0.4915 - val_loss: 0.5246\n",
      "Epoch 16/100\n",
      "11610/11610 [==============================] - 1s 70us/sample - loss: 0.4842 - val_loss: 0.5172\n",
      "Epoch 17/100\n",
      "11610/11610 [==============================] - 1s 79us/sample - loss: 0.4778 - val_loss: 0.5099\n",
      "Epoch 18/100\n",
      "11610/11610 [==============================] - 1s 71us/sample - loss: 0.4722 - val_loss: 0.5033\n",
      "Epoch 19/100\n",
      "11610/11610 [==============================] - 1s 66us/sample - loss: 0.4668 - val_loss: 0.4984\n",
      "Epoch 20/100\n",
      "11610/11610 [==============================] - 1s 63us/sample - loss: 0.4625 - val_loss: 0.4921\n",
      "Epoch 21/100\n",
      "11610/11610 [==============================] - 1s 66us/sample - loss: 0.4582 - val_loss: 0.4866\n",
      "Epoch 22/100\n",
      "11610/11610 [==============================] - 1s 96us/sample - loss: 0.4541 - val_loss: 0.4824\n",
      "Epoch 23/100\n",
      "11610/11610 [==============================] - 1s 108us/sample - loss: 0.4507 - val_loss: 0.4777\n",
      "Epoch 24/100\n",
      "11610/11610 [==============================] - 1s 77us/sample - loss: 0.4474 - val_loss: 0.4743\n",
      "Epoch 25/100\n",
      "11610/11610 [==============================] - 1s 69us/sample - loss: 0.4440 - val_loss: 0.4708\n",
      "Epoch 26/100\n",
      "11610/11610 [==============================] - 1s 75us/sample - loss: 0.4417 - val_loss: 0.4671\n",
      "Epoch 27/100\n",
      "11610/11610 [==============================] - 1s 69us/sample - loss: 0.4390 - val_loss: 0.4643\n",
      "Epoch 28/100\n",
      "11610/11610 [==============================] - 1s 85us/sample - loss: 0.4366 - val_loss: 0.4616\n",
      "Epoch 29/100\n",
      "11610/11610 [==============================] - 1s 92us/sample - loss: 0.4341 - val_loss: 0.4582\n",
      "Epoch 30/100\n",
      "11610/11610 [==============================] - 1s 77us/sample - loss: 0.4322 - val_loss: 0.4575\n",
      "Epoch 31/100\n",
      "11610/11610 [==============================] - 1s 66us/sample - loss: 0.4302 - val_loss: 0.4542\n",
      "Epoch 32/100\n",
      "11610/11610 [==============================] - 1s 71us/sample - loss: 0.4282 - val_loss: 0.4515\n",
      "Epoch 33/100\n",
      "11610/11610 [==============================] - 1s 67us/sample - loss: 0.4265 - val_loss: 0.4489\n",
      "Epoch 34/100\n",
      "11610/11610 [==============================] - 1s 73us/sample - loss: 0.4248 - val_loss: 0.4475\n",
      "Epoch 35/100\n",
      "11610/11610 [==============================] - 1s 76us/sample - loss: 0.4232 - val_loss: 0.4457\n",
      "Epoch 36/100\n",
      "11610/11610 [==============================] - 1s 63us/sample - loss: 0.4216 - val_loss: 0.4433\n",
      "Epoch 37/100\n",
      "11610/11610 [==============================] - 1s 61us/sample - loss: 0.4202 - val_loss: 0.4421\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train_scaled, y_train,\n",
    "                    validation_data = (x_valid_scaled, y_valid),\n",
    "                    epochs = 100,\n",
    "                    callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "plot_learning_curves(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160 [==============================] - 0s 52us/sample - loss: 0.3915\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.3914947641912357"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
